/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package occho.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import occho.model.Asignatura;
import occho.model.Tema;
import occho.model.Test;
import occho.model.Usuario;
import occho.view.AsignaturasFrame;

/**
 *
 * @author Jorge
 */
public class OracleAsignaturaDAO implements AsignaturaDAO {
    
    private Connection conn = null;
    
    /**
     * Constructor de la clase
     * @param conn
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    public OracleAsignaturaDAO(Connection conn) throws SQLException, ClassNotFoundException {
        this.conn = conn;
    }

    @Override
    public boolean insertarAsignatura(Asignatura asig, Usuario usuario) throws SQLException {
        PreparedStatement stmt = conn.prepareStatement("insert into asignatura (idAsignatura, nombre, idProfesor) values(seq_asignatura.nextval, ?, ?)");
        stmt.clearParameters();
        //stmt.setInt(1, asig.getIdAsignatura());
        stmt.setString(1, asig.getNombre());
        stmt.setInt(2, usuario.getIdUsuario());
        if (stmt.executeUpdate() > 0) {
            stmt.close();
            return true;
        }
        else {
            stmt.close();
            return false;
        }
    }

    @Override
    public boolean borrarAsignatura(Asignatura asig) throws SQLException {
        PreparedStatement stmt = conn.prepareStatement("delete from asignatura_v where idAsignatura = ?");
        stmt.clearParameters();
        stmt.setInt(1, asig.getIdAsignatura());
        if (stmt.executeUpdate() > 0) {
            stmt.close();
            return true;
        }
        else {
            stmt.close();
            return false;
        }
    }

    @Override
    public Asignatura seleccionarAsignatura(Asignatura asig) throws SQLException, ClassNotFoundException {
        PreparedStatement stmt = conn.prepareStatement("select * from asignatura where idAsignatura = ?");
        stmt.clearParameters();
        stmt.setInt(1, asig.getIdAsignatura());
        ResultSet rs = stmt.executeQuery();
        if (rs.next()) {
            OracleDAOFactory daoFactory = OracleDAOFactory.getInstancia();
            TemaDAO temaDAO = daoFactory.getTemaDAO();
            TestDAO testDAO = daoFactory.getTestDAO();
            List<Tema> temas = temaDAO.seleccionarTemas(asig);
            List<Test> tests = testDAO.seleccionarTests(asig);
            Asignatura a = new Asignatura(rs.getInt("idAsignatura"), rs.getString("nombre"),
                    temas, tests);
            rs.close();
            stmt.close();
            return a;
        }
        else {
            rs.close();
            stmt.close();
            return null;
        }
    }

    @Override
    public List<Asignatura> seleccionarAsignaturas() throws SQLException, ClassNotFoundException {
        OracleDAOFactory daoFactory = OracleDAOFactory.getInstancia();
        TemaDAO temaDAO = daoFactory.getTemaDAO();
        TestDAO testDAO = daoFactory.getTestDAO();
        PreparedStatement stmt = conn.prepareStatement("select * from asignatura");
        stmt.clearParameters();
        ResultSet rs = stmt.executeQuery();
        List<Asignatura> asignaturas = new Vector<Asignatura>();
        while(rs.next()) {
            Asignatura asig = new Asignatura();
            int id = rs.getInt("idAsignatura");
            String nombre = rs.getString("nombre");
            asig.setIdAsignatura(id);
            asignaturas.add(new Asignatura(id, nombre, temaDAO.seleccionarTemas(asig), 
                    testDAO.seleccionarTests(asig)));
        }
        rs.close();
        stmt.close();
        return asignaturas;
    }

    @Override
    public List<Asignatura> seleccionarAsignaturas(Usuario usuario) throws SQLException, ClassNotFoundException {
        if (usuario.getTipo().equals(Usuario.PROFESOR)) {
            return seleccionarAsignaturasProfesor(usuario);
        } else {
            return seleccionarAsignaturasAlumno(usuario);
        }
    }
    
   
    
    private List<Asignatura> seleccionarAsignaturasProfesor(Usuario usuario) throws ClassNotFoundException, SQLException {
        OracleDAOFactory daoFactory = OracleDAOFactory.getInstancia();
        TemaDAO temaDAO = daoFactory.getTemaDAO();
        TestDAO testDAO = daoFactory.getTestDAO();
        PreparedStatement stmt = 
                conn.prepareStatement("select * from asignatura where idProfesor = ?");
        stmt.clearParameters();
        stmt.setInt(1, usuario.getIdUsuario());
        ResultSet rs = stmt.executeQuery();
        Vector<Asignatura> asignaturas = new Vector<Asignatura>();
        while(rs.next()) {
            Asignatura asig = new Asignatura();
            int id = rs.getInt("idAsignatura");
            String nombre = rs.getString("nombre");
            asig.setIdAsignatura(id);
            asignaturas.add(new Asignatura(id, nombre, temaDAO.seleccionarTemas(asig), 
                    testDAO.seleccionarTests(asig)));
        }
        rs.close();
        stmt.close();
        return asignaturas;
    }
    
    private List<Asignatura> seleccionarAsignaturasAlumno(Usuario usuario) throws SQLException, ClassNotFoundException {
        OracleDAOFactory daoFactory = OracleDAOFactory.getInstancia();
        TestDAO testDAO = daoFactory.getTestDAO();
        String sql = "select distinct asig.idasignatura, asig.nombre " + 
                "from test t, pregunta_alumno pa, asignatura asig " + 
                "where pa.idtest = t.idtest and pa.idalumno = ? and " + 
                "asig.idasignatura = t.idasignatura";
        PreparedStatement stmt = conn.prepareStatement(sql);
        stmt.clearParameters();
        stmt.setInt(1, usuario.getIdUsuario());
        ResultSet rs = stmt.executeQuery();
        List<Asignatura> asignaturas = new Vector<Asignatura>();
        while (rs.next()) {
            Asignatura asig = new Asignatura();
            asig.setIdAsignatura(rs.getInt("idasignatura"));
            asig.setNombre(rs.getString("nombre"));
            asig.setTests(testDAO.seleccionarTests(usuario, asig));
            asignaturas.add(asig);
        }
        rs.close();
        stmt.close();
        return asignaturas;
    }
}
